Node.js Middleware

Node.js

মিডলওয়্যারের পরিচিতি

মিডলওয়্যার হল Node.js ওয়েব অ্যাপ্লিকেশনের একটি গুরুত্বপূর্ণ অংশ, বিশেষ করে Express.js-এ।

এটি আপনার অ্যাপ্লিকেশনের রুট এবং এন্ডপয়েন্ট জুড়ে সাধারণ কার্যকারিতা যোগ এবং পুনরায় ব্যবহার করার একটি উপায় প্রদান করে।

মিডলওয়্যারের মূল বৈশিষ্ট্য:

একটি অনুরোধ-প্রতিক্রিয়া চক্রে চলে

অনুরোধ এবং প্রতিক্রিয়া বস্তু পরিবর্তন করা যেতে পারে

আসুন অনুরোধ-প্রতিক্রিয়া চক্রটি সম্পূর্ণ করি

স্ট্যাকের পরবর্তী মিডলওয়্যারটিকে কল করুন

একাধিক স্তর

অ্যাপ্লিকেশন-স্তর, রাউটার-স্তর, বা রুট-নির্দিষ্ট হতে পারে

এটি উৎস অনুরোধ এবং চূড়ান্ত রুট হ্যান্ডলারের মধ্যে একটি সেতু হিসাবে কাজ করে।

এর মূলে, মিডলওয়্যার হল একটি ফাংশন যার অ্যাক্সেস রয়েছে:

মিডলওয়্যার ফাংশন বিভিন্ন কাজ সম্পাদন করতে পারে:

মিডলওয়্যারকে প্রসেসিং লেয়ারগুলির একটি সিরিজ হিসাবে ভাবুন যা অনুরোধগুলি প্রতিক্রিয়া পাওয়ার আগে পাস করে—যেমন HTTP অনুরোধগুলির জন্য একটি সমাবেশ লাইন।

মিডলওয়্যার কিভাবে কাজ করে

মিডলওয়্যার ক্রিয়াকলাপগুলি সেগুলিকে যে ক্রমে সংজ্ঞায়িত করা হয়েছে সেই ক্রমে সম্পাদন করে, একটি পাইপলাইন গঠন করে যার মাধ্যমে অনুরোধগুলি প্রবাহিত হয়।

প্রতিটি মিডলওয়্যার ফাংশন অনুরোধ এবং প্রতিক্রিয়া বস্তুর উপর ক্রিয়াকলাপ সম্পাদন করতে পারে এবং পরবর্তী মিডলওয়্যারে নিয়ন্ত্রণ পাস করতে বা অনুরোধ-প্রতিক্রিয়া চক্রটি সম্পূর্ণ করতে পারে কিনা তা সিদ্ধান্ত নিতে পারে।

মিডলওয়্যারের মাধ্যমে একটি অনুরোধের জীবনচক্র:

অনুরোধ সার্ভার দ্বারা গৃহীত হয়েছে
ক্রমানুসারে প্রতিটি মিডলওয়্যার মাধ্যমে পাস
একটি রুট হ্যান্ডলার অনুরোধটি প্রক্রিয়া করে
প্রতিক্রিয়া মিডলওয়্যারের মাধ্যমে পিছনের দিকে (বিপরীত ক্রমে) প্রবাহিত হয়।
একটি প্রতিক্রিয়া ক্লায়েন্ট পাঠানো হয়

Express.js :

app.use((req, res, next) => {
  //    
  console.log('Time:', Date.now());
  
  //      next()  
  next();
});

যখন আপনি next() কল করেন, স্ট্যাকের পরবর্তী মিডলওয়্যারটি কার্যকর হয়।

আপনি next() কল না করলে, অনুরোধ-প্রতিক্রিয়া লুপ শেষ হয়ে যায় এবং আর কোন মিডলওয়্যার চলে না।

উদাহরণ: একটি সাধারণ মিডলওয়্যার চেইন

const express = require('express'); const app = express(); // প্রথম মিডলওয়্যার app.use((req, res, next) => { console.log('মিডলওয়্যার 1: এটি সর্বদা চলে'); পরবর্তী(); }); // দ্বিতীয় মিডলওয়্যার app.use((req, res, next) => { console.log('মিডলওয়্যার 2: এটিও সবসময় চলে'); পরবর্তী(); }); // রুট হ্যান্ডলার app.get('/', (req, res) => { res.send('হ্যালো ওয়ার্ল্ড!'); }); app.listen(8080, () => { console.log('পোর্ট 8080 এ চলছে সার্ভার'); });

যখন রুট পাথে ('/') একটি অনুরোধ করা হয়, তখন নিম্নলিখিতগুলি ঘটে:

মিডলওয়্যার প্রকারের জন্য একটি ব্যাপক গাইড

বিভিন্ন ধরণের মিডলওয়্যার বোঝা আপনাকে আপনার অ্যাপ্লিকেশন যুক্তিকে কার্যকরভাবে সংগঠিত করতে সহায়তা করে।

মিডলওয়্যারকে এর উদ্দেশ্য, উদ্দেশ্য এবং এটি কীভাবে অ্যাপ্লিকেশনের সাথে খাপ খায় তার উপর ভিত্তি করে শ্রেণীবদ্ধ করা যেতে পারে।

🎯সঠিক টাইপ নির্বাচন করা:

আপনি যে ধরনের মিডলওয়্যার ব্যবহার করেন তা আপনার নির্দিষ্ট চাহিদার উপর নির্ভর করে, যেমন মিডলওয়্যারটি সমস্ত অনুরোধের জন্য সক্রিয় করা উচিত বা শুধুমাত্র নির্দিষ্ট রুটের জন্য, এবং এটির জন্য একটি রাউটার উদাহরণে অ্যাক্সেস প্রয়োজন কিনা।

Node.js , Express.js , :

অ্যাপ্লিকেশন-স্তরের মিডলওয়্যার

App.use() বা app.METHOD() ফাংশন ব্যবহার করে অ্যাপ্লিকেশন-লেভেল মিডলওয়্যার এক্সপ্রেস অ্যাপ্লিকেশন ইনস্ট্যান্সে আবদ্ধ।

💡ক্ষেত্রে ব্যবহার করুন:

নিবন্ধন, প্রমাণীকরণ, অনুরোধ পার্সিং এবং অন্যান্য ফাংশন যা প্রতিটি অনুরোধের জন্য সম্পাদন করা প্রয়োজন।

const express = require('express'); const app = express(); // অ্যাপ্লিকেশন-স্তরের মিডলওয়্যার app.use((req, res, next) => { console.log('Time:', Date.now()); পরবর্তী(); });

রাউটার-স্তরের মিডলওয়্যার

রাউটার-লেভেল মিডলওয়্যার অ্যাপ্লিকেশন-লেভেল মিডলওয়্যারের মতো কাজ করে, কিন্তু এক্সপ্রেসের একটি উদাহরণে আবদ্ধ। রাউটার()।

📁সুবিধা:

আরও ভালো কোড সংগঠন, মডুলার রাউটিং এবং নির্দিষ্ট রুট গ্রুপের জন্য মিডলওয়্যার ব্যবহার করার ক্ষমতা।

const express = require('express'); const রাউটার = express.Router(); // রাউটার-স্তরের মিডলওয়্যার router.use((req, res, next) => { console.log('রাউটার নির্দিষ্ট মিডলওয়্যার'); পরবর্তী(); }); router.get('/user/:id', (req, res) => { res.send('ব্যবহারকারীর প্রোফাইল'); }); // অ্যাপ্লিকেশনে রাউটার যোগ করুন app.use('/api', রাউটার);

ত্রুটি-হ্যান্ডলিং মিডলওয়্যার

ত্রুটি-হ্যান্ডলিং মিডলওয়্যারকে চারটি আর্গুমেন্ট (err, req, res, next) দিয়ে সংজ্ঞায়িত করা হয় এবং অনুরোধ প্রক্রিয়াকরণের সময় ঘটে যাওয়া ত্রুটিগুলি পরিচালনা করতে ব্যবহৃত হয়।

⚠️মূল পয়েন্ট:

  • ঠিক চারটি প্যারামিটার থাকতে হবে
  • অন্যান্য app.use() এবং রুট কলের পরে সংজ্ঞায়িত করা আবশ্যক
  • ত্রুটি হ্যান্ডলিং যুক্তি কেন্দ্রীকরণ করতে ব্যবহার করা যেতে পারে
  • নেক্সট(err) ব্যবহার করে পরবর্তী ত্রুটি হ্যান্ডলারে ত্রুটিগুলি প্রেরণ করা যেতে পারে।
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

অন্তর্নির্মিত মিডলওয়্যার

এক্সপ্রেস অনেক অন্তর্নির্মিত মিডলওয়্যার ফাংশন অন্তর্ভুক্ত করে যা সাধারণ ওয়েব অ্যাপ্লিকেশন কাজগুলি পরিচালনা করে।

// JSON বডি পার্স করুন app.use(express.json()); // URL-এনকোডেড বডি পার্স করুন app.use(express.urlencoded({ বর্ধিত: সত্য })); // স্ট্যাটিক ফাইল পরিবেশন করুন app.use(express.static('public'));

তৃতীয় পক্ষের মিডলওয়্যার

Node.js Express .

const morgan = require('morgan'); const helmet = প্রয়োজন ('হেলমেট'); // HTTP অনুরোধ লগিং টুল app.use(morgan('dev')); // নিরাপত্তা শিরোনাম app.use(হেলমেট());

কাস্টম মিডলওয়্যার তৈরি এবং স্থাপন করা

কাস্টম মিডলওয়্যার তৈরি করা আপনাকে পুনরায় ব্যবহারযোগ্য উপায়ে অ্যাপ্লিকেশন-নির্দিষ্ট কার্যকারিতা বাস্তবায়ন করতে দেয়।

🔧সর্বোত্তম অনুশীলন:

  • মিডলওয়্যারকে একটি একক দায়িত্বে নিবদ্ধ রাখুন
  • মিডলওয়্যারের উদ্দেশ্য এবং প্রয়োজনীয়তা নথিভুক্ত করুন
  • ত্রুটিগুলি সঠিকভাবে পরিচালনা করুন
  • কর্মক্ষমতা প্রভাব বিবেচনা করুন
  • মিডলওয়্যারটিকে বিকল্পের মাধ্যমে কনফিগারযোগ্য করুন

উদাহরণ: সাধারণ লগিং টুল মিডলওয়্যার

// একটি সাধারণ লগিং মিডলওয়্যার তৈরি করুন ফাংশন requestLogger(req, res, next) { const টাইমস্ট্যাম্প = নতুন তারিখ().toISOSstring(); console.log(`${timestamp} - ${req.method} ${req.url}`); পরবর্তী(); // পরবর্তীতে কল করতে ভুলবেন না() } // মিডলওয়্যার ব্যবহার করুন app.use(requestLogger);

উদাহরণ: প্রমাণীকরণ মিডলওয়্যার

// প্রমাণীকরণ মিডলওয়্যার ফাংশন প্রমাণীকরণ (req, res, পরবর্তী) { const authHeader = req.headers.authorization; যদি (!authHeader) { রিটার্ন res.status(401).send('Authentication প্রয়োজনীয়'); } const টোকেন = authHeader.split('')[1]; // টোকেন যাচাই করুন (সরলীকৃত) যদি (টোকেন === 'সিক্রেট-টোকেন') { // প্রমাণীকরণ সফল req.user = {id: 123, username: 'john' }; পরবর্তী(); } অন্য { res.status(403).send('অবৈধ টোকেন'); } } // নির্দিষ্ট রুটের জন্য ব্যবহার করুন app.get('/api/protected', প্রমাণীকরণ, (req, res) => { res.json({ বার্তা: 'সুরক্ষিত ডেটা', ব্যবহারকারী: req.user }); });

উদাহরণ: রিকোয়েস্ট ভ্যালিডেশন মিডলওয়্যার

// একটি ব্যবহারকারী উত্পন্ন অনুরোধ বৈধ করুন ফাংশন validateUserCreation(req, res, next) { const { username, email, password } = req.body; // সহজ বৈধতা যদি (!username || username.length <3) { res.status(400).json({ ত্রুটি: 'ব্যবহারকারীর নাম কমপক্ষে 3টি অক্ষর হতে হবে' }); } যদি (!email || !email.includes('@')) { res.status(400).json({ ত্রুটি: 'বৈধ ইমেল প্রয়োজন' }); } যদি (!password || password.length <6) { res.status(400).json({ error: 'পাসওয়ার্ড কমপক্ষে 6 অক্ষরের হতে হবে' }); } // বৈধতা পাস পরবর্তী(); } // ব্যবহারকারীর তৈরি রুটের জন্য ব্যবহার করুন app.post('/api/users', validateUserCreation, (req, res) => { // সঠিক ব্যবহারকারী তৈরির প্রক্রিয়া করুন res.status(201).json({ বার্তা: 'ব্যবহারকারী সফলভাবে তৈরি' }); });

ত্রুটি-হ্যান্ডলিং মিডলওয়্যার

ত্রুটি-হ্যান্ডলিং মিডলওয়্যারটি বিশেষ কারণ এটি তিনটির পরিবর্তে চারটি পরামিতি নেয়: (err, req, res, next)।

উদাহরণ: বেসিক এরর হ্যান্ডলার

const express = require('express'); const app = express(); // একটি ত্রুটি নিক্ষেপ করার প্রচলিত উপায় app.get('/error-demo', (req, res, next) => { চেষ্টা করুন { // একটি ত্রুটি অনুকরণ নতুন ত্রুটি নিক্ষেপ ('কিছু ভুল হয়েছে!'); } ধরা (ত্রুটি) { পরবর্তী (ত্রুটি); // ত্রুটি হ্যান্ডলারের কাছে ত্রুটিটি পাস করুন } }); // ত্রুটি-হ্যান্ডলিং মিডলওয়্যার app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ বার্তা: 'একটি ত্রুটি ঘটেছে', ত্রুটি: process.env.NODE_ENV === 'উৎপাদন'? {} : ভুল }); });

অ্যাসিঙ্ক্রোনাস ত্রুটি পরিচালনা

অ্যাসিঙ্ক্রোনাস মিডলওয়্যারের জন্য, বিশ্বাস প্রত্যাখ্যানগুলি ধরা এবং সেগুলিকে পরবর্তী():

// সঠিক ত্রুটি পরিচালনা সহ অ্যাসিঙ্ক্রোনাস মিডলওয়্যার app.get('/async-data', async (req, res, next) => { চেষ্টা করুন { const data = ওয়েট fetchDataFromDatabase(); res.json(ডেটা); } ধরা (ত্রুটি) { পরবর্তী (ত্রুটি); // ত্রুটি হ্যান্ডলারের কাছে ত্রুটিটি পাস করুন } }); // এক্সপ্রেস 4.16+ র্যাপার ব্যবহার করে প্রতিস্থাপন করুন ফাংশন asyncHandler(fn) { ফেরত (req, res, next) => { Promise.resolve(fn(req, res, next)).catch(পরবর্তী); }; } app.get('/better-async', asyncHandler(async (req, res) => { const data = ওয়েট fetchDataFromDatabase(); res.json(ডেটা); }));

ℹ️দ্রষ্টব্য:

এক্সপ্রেস 5 (বর্তমানে বিটাতে) স্বয়ংক্রিয়ভাবে বিশ্বাস প্রত্যাখ্যানগুলি ক্যাচ করে এবং একটি ত্রুটি হ্যান্ডলারের কাছে পাঠায়।

মিডলওয়্যার এক্সিকিউশন সিকোয়েন্স

মিডলওয়্যারটি যে ক্রমে সংজ্ঞায়িত করা হয়েছে তা উল্লেখযোগ্যভাবে আরও গুরুত্বপূর্ণ।

এক্সপ্রেস অ্যাপ্লিকেশানে যোগ করা ক্রমে মিডলওয়্যার চালায়।

উদাহরণ: অর্ডার গুরুত্বপূর্ণ

const express = require('express'); const app = express(); // এই মিডলওয়্যারটি প্রথমে চলবে app.use((req, res, next) => { console.log('প্রথম মিডলওয়্যার'); পরবর্তী(); }); // এই মিডলওয়্যারটি শুধুমাত্র /ব্যবহারকারীদের পাথের জন্য চলে app.use('/users', (req, res, next) => { console.log('ব্যবহারকারীর মিডলওয়্যার'); পরবর্তী(); }); // হ্যান্ডলার মিলে গেলে এই পদ্ধতি চলবে app.get('/users', (req, res) => { res.send('ব্যবহারকারীদের তালিকা'); }); // এই মিডলওয়্যার সফলভাবে মিলে যাওয়া রুটের জন্য কখনই চলবে না // কারণ রুট হ্যান্ডলাররা অনুরোধ-প্রতিক্রিয়া চক্র সম্পূর্ণ করে app.use((req, res, next) => { console.log('এটি মিলে যাওয়া রুটের জন্য চলবে না'); পরবর্তী(); }); // এটি অ-ম্যাচিং রুটের জন্য একটি "ক্যাচ-অল" মিডলওয়্যার app.use((req, res) => { res.status(404).send('not found'); });

মিডলওয়্যার অ্যারের জন্য সেরা অনুশীলন:

// 1. অ্যাপ্লিকেশন-ওয়াইড মিডলওয়্যার app.use(express.json()); app.use(express.urlencoded({ বর্ধিত: সত্য })); app.use(morgan('dev')); app.use(হেলমেট()); // 2. রুট-নির্দিষ্ট মিডলওয়্যার app.use('/api', প্রমাণীকরণ); // 3. রুট app.use('/api/users', userRoutes); app.use('/api/products', productRoutes); // 4. 404 হ্যান্ডলার app.use((req, res) => { res.status(404).json({ message: 'not found' }); }); // 5. ত্রুটি হ্যান্ডলার (সর্বদা শেষ) app.use((err, req, res, next) => { console.error(err); res.status(500).json({ বার্তা: 'সার্ভার ত্রুটি' }); });

সর্বোত্তম অনুশীলন

Node.js :

1. মিডলওয়্যার ফোকাসে রাখুন

প্রতিটি মিডলওয়্যারের একটি একক দায়িত্ব থাকা উচিত এবং একক দায়িত্ব নীতি অনুসরণ করা উচিত।

2. সঠিকভাবে Next() ব্যবহার করুন

3. অ্যাসিঙ্ক্রোনাস কোড সঠিকভাবে পরিচালনা করুন

সর্বদা অ্যাসিঙ্ক্রোনাস মিডলওয়্যারে ত্রুটিগুলি ধরুন এবং সেগুলিকে পরবর্তী() এ প্রেরণ করুন।

4. মিডলওয়্যার অতিরিক্ত ব্যবহার করবেন না

অনেক মিডলওয়্যার ফাংশন কর্মক্ষমতা প্রভাবিত করতে পারে। তাদের বুদ্ধিমানের সাথে ব্যবহার করুন।

5. ডোমেন দ্বারা সংগঠিত

কার্যকারিতার উপর ভিত্তি করে পৃথক ফাইলে সম্পর্কিত মিডলওয়্যারকে গ্রুপ করুন।

// Middleware/auth.js exports.authenticate = (req, res, next) => { // প্রমাণীকরণ যুক্তি }; exports.requireAdmin = (req, res, next) => { // অ্যাডমিন বৈধতা যুক্তি }; // আপনার app.js-এ const { প্রমাণীকরণ, requireAdmin } = require('./middleware/auth'); app.use('/admin', প্রমাণীকরণ, প্রয়োজনীয় অ্যাডমিন);

6. শর্তসাপেক্ষ Next() ব্যবহার করুন

মিডলওয়্যার শর্তগুলির উপর ভিত্তি করে চেইনটি চালিয়ে যাবে কিনা তা সিদ্ধান্ত নিতে পারে:

// হার নিয়ন্ত্রণ মিডলওয়্যার উদাহরণ ফাংশনের হারসীমা (অনুরোধ, রেস, পরবর্তী) { const ip = req.ip; // আইপি অনেক অনুরোধ করেছে কিনা তা পরীক্ষা করুন যদি (tooManyRequests(ip)) { রিটার্ন res.status(429).send('অনেক অনুরোধ'); // দ্রষ্টব্য: এখানে আমরা পরবর্তী () কল করব না } // অন্যথায় চালিয়ে যান পরবর্তী(); }

💡পেশাগত পরামর্শ:

নির্দিষ্ট কনফিগারেশনের সাথে মিডলওয়্যার তৈরি করে এমন ফাংশনগুলিকে কল করে পুনরায় ব্যবহারযোগ্য মিডলওয়্যার কারখানা তৈরি করুন।

// মিডলওয়্যার কারখানা ফাংশন প্রয়োজন ভূমিকা(ভূমিকা) { ফেরত (req, res, next) => { যদি (req.user && req.user.role === ভূমিকা) { পরবর্তী(); } অন্য { res.status(403).send('Access Denied'); } }; } // আবেদন app.get('/admin', authenticate, requireRole('admin'), (req, res) => { res.send('অ্যাডমিন ড্যাশবোর্ড'); }); app.get('/editor', authenticate, requireRole('editor'), (req, res) => { res.send('সম্পাদক ড্যাশবোর্ড'); });

অনুশীলন করুন

এক্সপ্রেস মিডলওয়্যার ফাংশনগুলির অনুরোধ, প্রতিক্রিয়া এবং ______ অবজেক্টগুলিতে অ্যাক্সেস রয়েছে।

application
✗ ভুল! "অ্যাপ্লিকেশন" অবজেক্টের মিডলওয়্যার ফাংশনে সরাসরি অ্যাক্সেস নেই
server
✗ ভুল! "সার্ভার" অবজেক্টের মিডলওয়্যার ফাংশনে সরাসরি অ্যাক্সেস নেই
next
✓ ঠিক আছে! "পরবর্তী" হল একটি তৃতীয় অবজেক্ট যা মিডলওয়্যার অপারেশনগুলিতে অ্যাক্সেস রয়েছে, যা পরবর্তী মিডলওয়্যার অপারেশনকে নির্দেশ করে।
middleware
✗ ভুল! "মিডলওয়্যার" মানে মিডলওয়্যার ফাংশনে সরাসরি অ্যাক্সেস নয়